package com.bolt.auth.security.common.properties;

import com.bolt.common.utils.StrUtil;
import com.bolt.convention.exception.ServiceException;
import com.wf.captcha.*;
import com.wf.captcha.base.Captcha;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Setter
@Getter
@ConfigurationProperties(prefix = "bolt.security")
@RefreshScope
public class BoltSecurityProperties {

    private TokenRenewProperties tokenRenew = new TokenRenewProperties();

    private CaptchaCodeProperties captchaCode = new CaptchaCodeProperties();

    /**
     * 获取验证码生产类
     *
     * @return /
     */
    public Captcha getCaptcha() {
        if (Objects.isNull(captchaCode)) {
            captchaCode = new CaptchaCodeProperties();
            if (Objects.isNull(captchaCode.getCodeType())) {
                captchaCode.setCodeType(CaptchaCodeProperties.CaptchaEnum.arithmetic);
            }
        }
        return switchCaptcha(captchaCode);
    }

    /**
     * 依据配置信息生产验证码
     *
     * @param captchaCode 验证码配置信息
     * @return /
     */
    private Captcha switchCaptcha(CaptchaCodeProperties captchaCode) {
        Captcha captcha;
        synchronized (this) {
            switch (captchaCode.getCodeType()) {
                case arithmetic:
                    // 算术类型 https://gitee.com/whvse/EasyCaptcha
                    captcha = new ArithmeticCaptcha(captchaCode.getWidth(), captchaCode.getHeight());
                    // 几位数运算，默认是两位
                    captcha.setLen(captchaCode.getLength());
                    break;
                case chinese:
                    captcha = new ChineseCaptcha(captchaCode.getWidth(), captchaCode.getHeight());
                    captcha.setLen(captchaCode.getLength());
                    break;
                case chinese_gif:
                    captcha = new ChineseGifCaptcha(captchaCode.getWidth(), captchaCode.getHeight());
                    captcha.setLen(captchaCode.getLength());
                    break;
                case gif:
                    captcha = new GifCaptcha(captchaCode.getWidth(), captchaCode.getHeight());
                    captcha.setLen(captchaCode.getLength());
                    break;
                case spec:
                    captcha = new SpecCaptcha(captchaCode.getWidth(), captchaCode.getHeight());
                    captcha.setLen(captchaCode.getLength());
                    break;
                default:
                    throw new ServiceException("验证码配置信息错误！正确配置查看 switchCaptcha ");
            }
        }
        if (StrUtil.isNotBlank(captchaCode.getFontName())) {
            captcha.setFont(new Font(captchaCode.getFontName(), Font.PLAIN, captchaCode.getFontSize()));
        }
        captcha.setWidth(captchaCode.getWidth());
        captcha.setHeight(captcha.getHeight());
        return captcha;
    }

    @Setter
    @Getter
    public static class TokenRenewProperties {
        /**
         * 是否开启token自动续签（目前只有redis实现）
         */
        private Boolean enable = false;

        /**
         * 白名单，配置需要自动续签的应用id（与黑名单互斥，只能配置其中一个），不配置默认所有应用都生效
         * 配置enable为true时才生效
         */
        private List <String> includeClientIds = new ArrayList <>();

        /**
         * 黑名单，配置不需要自动续签的应用id（与白名单互斥，只能配置其中一个）
         * 配置enable为true时才生效
         */
        private List <String> exclusiveClientIds = new ArrayList <>();

        /**
         * 续签时间比例，当前剩余时间小于小于过期总时长的50%则续签
         */
        private Double timeRatio = 0.5;
    }

    @Setter
    @Getter
    public static class CaptchaCodeProperties {
        public enum CaptchaEnum {
            /**
             * 算数
             */
            arithmetic,
            /**
             * 中文
             */
            chinese,
            /**
             * 中文闪图
             */
            chinese_gif,
            /**
             * 闪图
             */
            gif,
            spec
        }

        /**
         * 验证码配置
         */
        private CaptchaEnum codeType;
        /**
         * 验证码有效期 分钟
         */
        private Long expiration = 2L;
        /**
         * 验证码内容长度
         */
        private int length = 2;
        /**
         * 验证码宽度
         */
        private int width = 111;
        /**
         * 验证码高度
         */
        private int height = 36;
        /**
         * 验证码字体
         */
        private String fontName;
        /**
         * 字体大小
         */
        private int fontSize = 25;
        /**
         * 设置认证通时需要验证码的clientId
         */
        private List <String> includeClientIds = new ArrayList <>();
    }
}

 